Che cosa sono i modelli linguistici?
Le applicazioni di intelligenza artificiale generativa sono basate su modelli linguistici, ovvero un tipo specializzato di modelli di Machine Learning che è possibile usare per eseguire attività di elaborazione di linguaggio naturale (NLP), tra cui:
- Determinazione del sentiment o altro tipo di classificazione del testo in linguaggio naturale.
- Riepilogo del testo.
- Confronto tra più origini di testo per determinare la somiglianza semantica.
- Generazione di un nuovo linguaggio naturale.
Sebbene i principi matematici alla base di questi modelli linguistici possano essere complessi, una conoscenza di base dell'architettura usata per implementarli può aiutare a comprendere concettualmente il loro funzionamento.
Modelli di trasformazione
I modelli di Machine Learning per l'elaborazione del linguaggio naturale si sono evoluti nel corso di molti anni. Gli attuali modelli Large Language Model sono basati sull'architettura di trasformazione, che si basa, estendendole, su alcune tecniche che si sono dimostrate efficaci nella modellazione dei vocabolari per supportare le attività di elaborazione del linguaggio naturale, e in particolare nella generazione di linguaggio. I modelli di trasformazione vengono sottoposti a training con grandi volumi di testo, che consentono loro di rappresentare le relazioni semantiche tra parole e di usare tali relazioni per determinare le probabili sequenze di testo che hanno senso. I modelli di trasformazione con un vocabolario sufficientemente grande sono in grado di generare risposte linguistiche difficili da distinguere dalle risposte umane.
L'architettura dei modelli di trasformazione è costituita da due componenti o blocchi:
- Un blocco codificatore che crea rappresentazioni semantiche del vocabolario usato per il training.
- Un blocco decodificatore che genera nuove sequenze linguistiche.
- Il training del modello viene eseguito con un volume elevato di testo in linguaggio naturale, spesso originato da Internet o da altre fonti pubbliche di testo.
- Le sequenze di testo vengono suddivise in token (ad esempio, singole parole) e il blocco del codificatore elabora queste sequenze di token usando una tecnica detta di attenzione per determinare le relazioni tra token (ad esempio, quali token influenzano la presenza di altri token in una sequenza, token diversi comunemente usati nello stesso contesto e così via).
- L'output del codificatore è una raccolta di vettori (matrici numeriche multivalore) in cui ogni elemento del vettore rappresenta un attributo semantico dei token. Questi vettori sono detti incorporamenti.
- Il blocco del decodificatore funziona su una nuova sequenza di token di testo e usa gli incorporamenti generati dal codificatore per generare un output nel linguaggio naturale appropriato.
- Ad esempio, data una sequenza input come “Quando il mio cane era", il modello può usare la tecnologia di attenzione per analizzare i token di input e gli attributi semantici codificati negli incorporamenti al fine di prevedere un completamento appropriato della frase, ad esempio "un cucciolo".
Nella pratica le implementazioni specifiche dell'architettura variano. Ad esempio, il modello BERT (Bidirectional Encoder Representations from Transformers) sviluppato da Google per supportare il proprio motore di ricerca usa solo il blocco codificatore, mentre il modello GPT (Generative Pretrained Transformer) sviluppato da OpenAI usa solo il blocco decodificatore.
Anche se una spiegazione completa di ogni aspetto dei modelli di trasformazione esula dall'ambito di questo modulo, una spiegazione di alcuni degli elementi principali di questi modelli può aiutare a comprendere come supportano l'intelligenza artificiale generativa.
Tokenizzazione
Il primo passaggio del training di un modello di trasformazione consiste nello scomporre il testo del training in token, ovvero nell'identificare ogni valore di testo univoco. Per semplicità, si può considerare ogni parola distinta nel testo di training come un token (anche se, in realtà, i token possono essere generati per parole parziali o per combinazioni di parole e punteggiatura).
Si consideri, ad esempio, la frase seguente:
I heard a dog bark loudly at a cat
Per tokenizzare questo testo, è possibile identificare ogni parola discreta e assegnarle un ID token. Ad esempio:
- I (1)
- heard (2)
- a (3)
- dog (4)
- bark (5)
- loudly (6)
- at (7)
- *("a" is already tokenized as 3)*
- cat (8)
La frase può ora essere rappresentata con i token: {1 2 3 4 5 6 7 3 8}. Analogamente, la frase "Ho sentito un gatto" potrebbe essere rappresentata come {1 2 3 8}.
Man mano che si procede con il training del modello, ogni nuovo token nel testo del training viene aggiunto al vocabolario con gli ID token appropriati:
- miagolare (9)
- skateboard (10)
- e così via…
Con un set sufficientemente ampio di testo di training, è possibile compilare un vocabolario di molte migliaia di token.
Incorporamenti
Sebbene possa essere comodo rappresentare i token come semplici ID, creando essenzialmente un indice per tutte le parole del vocabolario, questi non ci dicono nulla sul significato delle parole o sulle relazioni tra di esse. Per creare un vocabolario che incapsula le relazioni semantiche tra i token, occorre definire vettori contestuali, noti come incorporamenti, per i token. I vettori sono rappresentazioni numeriche multivalore di informazioni, ad esempio [10, 3, 1], in cui ogni elemento numerico rappresenta un particolare attributo delle informazioni. Per i token linguistici, ogni elemento del vettore di un token rappresenta un attributo semantico del token. Le categorie specifiche per gli elementi dei vettori in un modello linguistico vengono determinate durante il training in base alla frequenza con cui le parole vengono usate insieme o in contesti simili.
I vettori rappresentano linee nello spazio multidimensionale, descrivendo la direzione e la distanza lungo più assi (se si vuole fare bella figura con i propri amici matematici, si possono chiamare questi assi ampiezza e grandezza). Può essere utile considerare gli elementi in un vettore di incorporamento per un token come una rappresentazione di passi lungo un percorso in uno spazio multidimensionale. Ad esempio, un vettore con tre elementi rappresenta un percorso in uno spazio tridimensionale in cui i valori degli elementi indicano le unità percorse avanti/indietro, a sinistra/destra e su/giù. Nel complesso, il vettore descrive la direzione e la distanza del percorso dall'origine alla sua fine.
Gli elementi dei token nello spazio incorporamenti rappresentano ognuno un attributo semantico del token, in modo che i token semanticamente simili debbano generare vettori con un orientamento simile, o in altre parole, che puntino nella stessa direzione. Una tecnica denominata somiglianza del coseno viene usata per determinare se due vettori abbiano direzioni simili (indipendentemente dalla distanza) e quindi rappresentino parole semanticamente collegate. Come semplice esempio, si supponga che gli incorporamenti per i token siano costituiti da vettori con tre elementi:
- 4 ("cane"): [10,3,2]
- 8 ("gatto"): [10,3,1]
- 9 ("cucciolo"): [5,2,1]
- 10 ("skateboard"): [3,3,2]
È possibile tracciare questi vettori nello spazio tridimensionale, come illustrato di seguito:
I vettori di incorporamento per "cane" e "cucciolo" descrivono un percorso lungo una direzione quasi identica, la quale è anche abbastanza simile alla direzione per "gatto". Il vettore di incorporamento per "skateboard", tuttavia, descrive un percorso in una direzione molto diversa.
Nota
Quello riportato sopra è un esempio di modello semplice in cui ogni incorporamento ha solo tre dimensioni. I modelli linguistici reali hanno molte più dimensioni.
Esistono diversi modi per calcolare gli incorporamenti appropriati per un determinato set di token, tra cui gli algoritmi di modellazione del linguaggio come Word2Vec o il blocco codificatore in un modello di trasformazione.
Attenzione
I blocchi codificatore e decodificatore in un modello di trasformazione includono più livelli che formano la rete neurale del modello. Non è necessario esaminare in dettaglio tutti questi livelli, ma è utile considerare uno dei tipi di livelli usati in entrambi i blocchi: il livello di attenzione. L'attenzione è una tecnica usata per esaminare una sequenza di token di testo e cercare di quantificare la forza delle relazioni tra di essi. In particolare, l'auto-attenzione implica la considerazione del modo in cui gli altri token intorno a un determinato token ne influenzano il significato.
In un blocco codificatore, ogni token viene esaminato attentamente nel contesto e viene determinata una codifica appropriata per l'incorporamento del vettore. I valori del vettore si basano sulla relazione tra il token e gli altri token con cui compare di frequente. Questo approccio contestualizzato significa che la stessa parola potrebbe avere più incorporamenti a seconda del contesto in cui viene usata: ad esempio, "il cane della pistola" ha un significato ben diverso da "Ho sentito un cane abbaiare".
In un blocco decodificatore, i livelli di attenzione vengono usati per prevedere il token successivo in una sequenza. Per ogni token generato, il modello ha un livello di attenzione che tiene conto della sequenza di token fino a quel punto. Il modello considera quali sono i token più influenti nel prevedere quale dovrebbe essere il token successivo. Ad esempio, data la sequenza "Ho sentito un cane", il livello di attenzione potrebbe assegnare un peso maggiore ai token "sentito" e "cane" nel considerare la parola successiva nella sequenza:
Ho sentito un cane [abbaiare]
Tenere presente che il livello di attenzione lavora con le rappresentazioni vettoriali numeriche dei token, non con il testo vero e proprio. In un blocco decodificatore, il processo inizia con una sequenza di incorporamenti di token che rappresentano il testo da completare. La prima cosa che accade è che un altro livello di codifica posizionale aggiunge un valore a ogni incorporamento per indicare la sua posizione nella sequenza:
- [1,5,6,2] (Ho)
- [2,9,3,1] (sentito)
- [3,1,1,2] (un)
- [4,10,3,2] (cane)
Durante il training, l'obiettivo è prevedere il vettore del token finale nella sequenza in base ai token precedenti. Il livello di attenzione assegna un peso numerico a ogni token nella sequenza fino a quel punto. Usa questo valore per eseguire un calcolo sui vettori ponderati che produce un punteggio di attenzione che può essere usato per calcolare un possibile vettore per il token successivo. In pratica, una tecnica chiamata attenzione multi-testa usa diversi elementi degli incorporamenti per calcolare più punteggi di attenzione. Viene quindi usata una rete neurale per valutare tutti i token possibili al fine di determinare il token più probabile con cui continuare la sequenza. Il processo viene ripetuto per ogni token nella sequenza, usando la sequenza di output ottenuta fino a quel punto in modo regressivo come input per l'iterazione successiva, essenzialmente creando l'output un token alla volta.
L'animazione seguente mostra una rappresentazione semplificata del funzionamento del processo. Nella realtà, i calcoli eseguiti dal livello di attenzione sono più complessi, ma i principi possono essere semplificati come illustrato:
- Una sequenza di incorporamenti di token viene inserita nel livello di attenzione. Ogni token è rappresentato come un vettore di valori numerici.
- L'obiettivo di un blocco decodificatore è prevedere il token successivo nella sequenza, che sarà anche un vettore allineato a un incorporamento nel vocabolario del modello.
- Il livello di attenzione valuta la sequenza fino a quel punto e assegna pesi a ogni token per rappresentarne l'influenza relativa sul token successivo.
- I pesi possono essere usati per calcolare un nuovo vettore per il token successivo con un punteggio di attenzione. L'attenzione multi-testa usa elementi diversi negli incorporamenti per calcolare più token alternativi.
- Una rete neurale completamente connessa usa i punteggi nei vettori calcolati per prevedere il token più probabile dall'intero vocabolario.
- L'output previsto viene aggiunto alla sequenza ottenuta fino a quel punto, che viene usata come input per l'iterazione successiva.
Durante il training, la sequenza effettiva di token è nota: vengono semplicemente mascherati i token che vengono dopo nella sequenza rispetto alla posizione del token attualmente considerato. Come in qualsiasi rete neurale, il valore previsto per il vettore del token viene confrontato con il valore effettivo del vettore successivo nella sequenza e viene calcolata la perdita. I pesi vengono quindi adeguati in modo incrementale per ridurre la perdita e migliorare il modello. Quando viene usato per l'inferenza (previsione di una nuova sequenza di token), il livello di attenzione sottoposto a training applica pesi che prevedono il token più probabile nel vocabolario del modello allineato semanticamente alla sequenza ottenuta fino a quel punto.
Tutto questo significa che un modello di trasformazione come il GPT-4 (il modello alla base di ChatGPT e Bing) è progettato per accettare un input di testo (detto prompt) e generare un output sintatticamente corretto (detto completamento). In effetti, la "magia" del modello è la sua capacità di mettere insieme una frase coerente. Questa capacità non implica alcuna "conoscenza" o "intelligenza" da parte del modello, solo un vocabolario di grandi dimensioni e la capacità di generare sequenze significative di parole. Ciò che rende un modello Large Language Model come GPT-4 così potente, tuttavia, è l'enorme volume di dati usato per il training (dati pubblici e concessi in licenza da Internet) e la complessità della rete. Questo consente al modello di generare completamenti basati sulle relazioni tra le parole nel vocabolario usato per il training del modello, spesso generando output indistinguibile da una risposta umana allo stesso prompt.